<!DOCTYPE HTML>
<html>
<!--
Bug 943251 - Allow accessing about:config from WebIDE
-->
<head>
  <meta charset="utf-8">
  <title>Test Preference Actor</title>
  <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
  <link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css">
</head>
<body>
<pre id="test">
<script>

function runTests() {
  var Cu = Components.utils;
  var Cc = Components.classes;
  var Ci = Components.interfaces;

  var {require} = Cu.import("resource://devtools/shared/Loader.jsm", {});
  var {DebuggerClient} = require("devtools/shared/client/main");
  var {DebuggerServer} = require("devtools/server/main");
  var Services = require("Services");

  SimpleTest.waitForExplicitFinish();

  var {getPreferenceFront} = require("devtools/shared/fronts/preference");

  DebuggerServer.init();
  DebuggerServer.addBrowserActors();

  var client = new DebuggerClient(DebuggerServer.connectPipe());
  client.connect().then(function onConnect() {
    client.listTabs(function onListTabs(aResponse) {
      var p = getPreferenceFront(client, aResponse);

      var prefs = {};

      var localPref = {
        boolPref: true,
        intPref: 0x1234,
        charPref: "Hello World",
      };


      function checkValues() {
        is(prefs.boolPref, localPref.boolPref, "read/write bool pref");
        is(prefs.intPref, localPref.intPref, "read/write int pref");
        is(prefs.charPref, localPref.charPref, "read/write string pref");

        ["test.all.bool", "test.all.int", "test.all.string"].forEach(function(key) {
          var expectedValue;
          switch(Services.prefs.getPrefType(key)) {
            case Ci.nsIPrefBranch.PREF_STRING:
              expectedValue = Services.prefs.getCharPref(key);
              break;
            case Ci.nsIPrefBranch.PREF_INT:
              expectedValue = Services.prefs.getIntPref(key);
              break;
            case Ci.nsIPrefBranch.PREF_BOOL:
              expectedValue = Services.prefs.getBoolPref(key);
              break;
            default:
              ok(false, "unexpected pref type (" + key + ")");
              break;
          }

          is(prefs.allPrefs[key].value, expectedValue, "valid preference value (" + key + ")");
          is(prefs.allPrefs[key].hasUserValue, Services.prefs.prefHasUserValue(key), "valid hasUserValue (" + key + ")");
        });

        ["test.bool", "test.int", "test.string"].forEach(function(key) {
          ok(!prefs.allPrefs.hasOwnProperty(key), "expect no pref (" + key + ")");
          is(Services.prefs.getPrefType(key), Ci.nsIPrefBranch.PREF_INVALID, "pref (" + key + ") is clear");
        });

        client.close().then(() => {
          DebuggerServer.destroy();
          SimpleTest.finish()
        });
      }


      p.getAllPrefs().then((json) => prefs["allPrefs"]  = json)
      .then(() => p.setBoolPref("test.bool", localPref.boolPref))
      .then(() => p.setIntPref("test.int", localPref.intPref))
      .then(() => p.setCharPref("test.string", localPref.charPref))
      .then(() => p.getBoolPref("test.bool")).then((value) => prefs["boolPref"] = value)
      .then(() => p.getIntPref("test.int")).then((value) => prefs["intPref"] = value)
      .then(() => p.getCharPref("test.string")).then((value) => prefs["charPref"] = value)
      .then(() => p.clearUserPref("test.bool"))
      .then(() => p.clearUserPref("test.int"))
      .then(() => p.clearUserPref("test.string"))
      .then(checkValues);

    });
  });

}

window.onload = function () {
  SpecialPowers.pushPrefEnv({
    "set": [
      ["devtools.debugger.forbid-certified-apps", false],
      ["test.all.bool", true],
      ["test.all.int", 0x4321],
      ["test.all.string", "allizom"],
    ]
  }, runTests);
}
</script>
</pre>
</body>
</html>
